﻿using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using Controllers;
using Interfaces;
using Utilities;

namespace Views.Moduler
{
    public partial class Computere : UserControl
    {
        #region Fields

        private readonly Controller _controller;
        private IComputer _selectedComputer;

        #endregion

        #region Creation

        public Computere(Controller controller)
        {
            InitializeComponent();
            _controller = controller;

            OpdaterSide();
        }

        #endregion

        #region Event Handlers

        private void BtnSletEnhed_Click(object sender, RoutedEventArgs e)
        {
            var computerEnhed = LwEnheder.SelectedItem as IComputer;

            if (computerEnhed == null) return;

            _selectedComputer = computerEnhed;

            var result = MessageBox.Show(
                "Er du sikker på at du vil slette enheden:" + _selectedComputer.Navn + "? Hvis der er tilknyttet nogle udlån vil de blive slettet fra systemet.",
                "Er du sikker?", MessageBoxButton.YesNo, MessageBoxImage.Exclamation);

            if (result == MessageBoxResult.No) return;

            _controller.FjernComputerEnhed(_selectedComputer);

            OpdaterSide();
        }

        private void LwEnhed_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            var computerEnhed = LwEnheder.SelectedItem as IComputer;

            if (computerEnhed == null) return;

            _selectedComputer = computerEnhed;

            EnhedValgt();

            OpdaterComputerSpecifikationer();
        }

        private void BtnRedigerEnhed_Click(object sender, RoutedEventArgs e)
        {
            if (_selectedComputer != null)
            {
                var formular = new Form();
                formular.BtnSubmit = "Opdater";
                formular.Title = "Opdater " + _selectedComputer.Navn;

                formular.CreateTextBox("navn", "Computerens navn:", _selectedComputer.Navn, true);
                formular.CreateTextBox("cpu", "CPU:", _selectedComputer.CPU);
                formular.CreateTextBox("hdd", "HDD:", _selectedComputer.HDD);
                formular.CreateTextBox("gpu", "GPU:", _selectedComputer.GPU);
                formular.CreateTextBox("ram", "RAM:", _selectedComputer.RAM);
                formular.CreateTextBox("bundkort", "Bundkort:", _selectedComputer.Bundkort);
                formular.CreateTextBox("skærm", "Skærm:", _selectedComputer.Skærm);

                var window = new FormWindow(formular);
                if (window.ShowDialog() == true)
                {
                    string navn = (string)formular.Result["navn"];
                    string cpu = (string)formular.Result["cpu"];
                    string hdd = (string)formular.Result["hdd"];
                    string gpu = (string)formular.Result["gpu"];
                    string ram = (string)formular.Result["ram"];
                    string bundkort = (string)formular.Result["bundkort"];
                    string skærm = (string)formular.Result["skærm"];

                    if (navn.IsValidStringAndHasMaxLengthOf(25) &&
                        cpu.IsMaxLength(25) &&
                        hdd.IsMaxLength(25) &&
                        gpu.IsMaxLength(25) &&
                        ram.IsMaxLength(25) &&
                        bundkort.IsMaxLength(25) &&
                        skærm.IsMaxLength(25))
                    {
                        bool opdateret = _controller.OpdaterComputerEnhed(_selectedComputer, navn, cpu, hdd, gpu, ram, bundkort, skærm);
                        if (opdateret)
                        {
                            OpdaterComputerEnhedsListView();
                        }
                        else
                        {
                            MessageBox.Show("Der skete en fejl. Det kunne være fordi du har opdateret antallet, " +
                                            "til et tal der er mindre end mængden af udlån på denne enhed.",
                                            "Fejl",
                                            MessageBoxButton.OK,
                                            MessageBoxImage.Error);
                        }
                    }
                    else
                    {
                        string validationError = "";

                        if (!navn.IsValidString())
                            validationError += "Du skal udfylde enhedens navn. ";           
                        else
                            if (!navn.IsValidStringAndHasMaxLengthOf(25))
                                validationError += "Enhedens navn må maks være 25 tegn. ";

                        if (!cpu.IsMaxLength(25))
                            validationError += "CPU må maks være 25 tegn. ";

                        if (!hdd.IsMaxLength(25))
                            validationError += "HDD må maks være 25 tegn. ";

                        if (!gpu.IsMaxLength(25))
                            validationError += "GPU må maks være 25 tegn. ";

                        if (!ram.IsMaxLength(25))
                            validationError += "RAM må maks være 25 tegn. ";

                        if (!bundkort.IsMaxLength(25))
                            validationError += "Bundkort må maks være 25 tegn. ";

                        if (!skærm.IsMaxLength(25))
                            validationError += "Skærm må maks være 25 tegn. ";


                        if (!validationError.IsValidString()) return;

                        MessageBox.Show(validationError);
                    }
                }
            }
        }

        private void BtnOpretEnhed_Click(object sender, RoutedEventArgs e)
        {
            var oprettelsesDato = DateTime.Now;
            int antal = 1;
            var formular = new Form();
            formular.BtnSubmit = "Tilføj computer";
            formular.Title = "Tilføj ny computer";

            formular.CreateTextBox("navn", "Computerens navn:");
            formular.CreateTextBox("cpu", "CPU:");
            formular.CreateTextBox("hdd", "HDD:");
            formular.CreateTextBox("gpu", "GPU:");
            formular.CreateTextBox("ram", "RAM:");
            formular.CreateTextBox("bundkort", "Bundkort:");
            formular.CreateTextBox("skærm", "Skærm:");

            var formWindow = new FormWindow(formular);

            // hvis formularen blev submitted
            if (formWindow.ShowDialog() == true)
            {
                string navn = (string) formular.Result["navn"];
                string cpu = (string) formular.Result["cpu"];
                string hdd = (string) formular.Result["hdd"];
                string gpu = (string) formular.Result["gpu"];
                string ram = (string) formular.Result["ram"];
                string bundkort = (string) formular.Result["bundkort"];
                string skærm = (string) formular.Result["skærm"];

                if (navn.IsValidStringAndHasMaxLengthOf(25) &&
                    cpu.IsMaxLength(25) &&
                    hdd.IsMaxLength(25) &&
                    gpu.IsMaxLength(25) &&
                    ram.IsMaxLength(25) &&
                    bundkort.IsMaxLength(25) &&
                    skærm.IsMaxLength(25))
                {
                    bool oprettet = _controller.OpretComputerEnhed(navn, antal, oprettelsesDato, cpu, hdd, gpu, ram, bundkort, skærm);
                    if (oprettet)
                    {
                        OpdaterComputerEnhedsListView();
                    }
                }
                else
                {
                    string validationError = "";

                    if (!navn.IsValidString())
                        validationError += "Du skal udfylde enhedens navn. ";
                    else
                        if (!navn.IsValidStringAndHasMaxLengthOf(25))
                            validationError += "Enhedens navn må maks være 25 tegn. ";

                    if (!cpu.IsMaxLength(25))
                        validationError += "CPU må maks være 25 tegn. ";

                    if (!hdd.IsMaxLength(25))
                        validationError += "HDD må maks være 25 tegn. ";

                    if (!gpu.IsMaxLength(25))
                        validationError += "GPU må maks være 25 tegn. ";

                    if (!ram.IsMaxLength(25))
                        validationError += "RAM må maks være 25 tegn. ";

                    if (!bundkort.IsMaxLength(25))
                        validationError += "Bundkort må maks være 25 tegn. ";

                    if (!skærm.IsMaxLength(25))
                        validationError += "Skærm må maks være 25 tegn. ";


                    if (!validationError.IsValidString()) return;

                    MessageBox.Show(validationError);
                }
            }
        }

        private void BtnVisHistorik_Click(object sender, RoutedEventArgs e)
        {
            if (_selectedComputer == null) return;

            var window = new EnhedsHistorik(_controller,_selectedComputer);
            window.ShowDialog();
        }

        private void ListViewEnheder_MouseDoubleClick(object sender, MouseButtonEventArgs e)
        {
            if (_selectedComputer == null) return;

            VisRedigerWindow();
        }

        private void MenuItemVisUdlån_Click(object sender, RoutedEventArgs e)
        {
            if (_selectedComputer == null) return;

            VisRedigerWindow();
        }

	    #endregion

        #region Tilstandsstyring

        public void OpdaterSide()
        {
            LwEnheder.SelectedItem = null;
            _selectedComputer = null;
            BtnVisUdlån.IsEnabled = false;
            BtnVisHistorik.IsEnabled = false;
            BtnRediger.IsEnabled = false;
            BtnSletEnhed.IsEnabled = false;
            OpdaterComputerEnhedsListView();
            OpdaterComputerSpecifikationer();
            SkjulComputerSpecifikationer();
        }

        public void SkjulComputerSpecifikationer()
        {
            StackCPU.Visibility = Visibility.Collapsed;
            StackHDD.Visibility = Visibility.Collapsed;
            StackGPU.Visibility = Visibility.Collapsed;
            StackRAM.Visibility = Visibility.Collapsed;
            StackBundkort.Visibility = Visibility.Collapsed;
            StackSkærm.Visibility = Visibility.Collapsed;
        }

        public void OpdaterComputerSpecifikationer()
        {
            if (_selectedComputer != null)
            {
                string unit;
                
                unit = _selectedComputer.CPU;
                if (unit != "")
                {
                    TxtCPU.Text = unit;
                    StackCPU.Visibility = Visibility.Visible;
                }
                else StackCPU.Visibility = Visibility.Collapsed;

                unit = _selectedComputer.HDD;
                if (unit != "")
                {
                    TxtHDD.Text = unit;
                    StackHDD.Visibility = Visibility.Visible;
                }
                else StackHDD.Visibility = Visibility.Collapsed;

                unit = _selectedComputer.GPU;
                if (unit != "")
                {
                    TxtGPU.Text = unit;
                    StackGPU.Visibility = Visibility.Visible;
                }
                else StackGPU.Visibility = Visibility.Collapsed;

                unit = _selectedComputer.RAM;
                if (unit != "")
                {
                    TxtRAM.Text = unit;
                    StackRAM.Visibility = Visibility.Visible;
                }
                else StackRAM.Visibility = Visibility.Collapsed;

                unit = _selectedComputer.Bundkort;
                if (unit != "")
                {
                    TxtBundkort.Text = unit;
                    StackBundkort.Visibility = Visibility.Visible;
                }
                else StackBundkort.Visibility = Visibility.Collapsed;

                unit = _selectedComputer.Skærm;
                if (unit != "")
                {
                    TxtSkærm.Text = unit;
                    StackSkærm.Visibility = Visibility.Visible;
                }
                else StackSkærm.Visibility = Visibility.Collapsed;
            }
            else
            {
                TxtCPU.Clear();
                TxtHDD.Clear();
                TxtGPU.Clear();
                TxtRAM.Clear();
                TxtBundkort.Clear();
                TxtSkærm.Clear();
            }
        }

        public void OpdaterComputerEnhedsListView()
        {
            LwEnheder.ItemsSource = _controller.HentAlleComputere();
            OpdaterComputerSpecifikationer();
        }

        public void VisRedigerWindow()
        {
            if (_selectedComputer == null) return;

            var brugerDiverse = new ComputerUdlån(_controller, _selectedComputer, this);
            if (brugerDiverse.ShowDialog() == true)
            {
                OpdaterSide();
            }
        }

        public void EnhedValgt()
        {
            BtnRediger.IsEnabled = true;
            BtnSletEnhed.IsEnabled = true;
            BtnVisUdlån.IsEnabled = true;
            BtnVisUdlån.IsDefault = true;
            BtnVisHistorik.IsEnabled = true;
        }

        #endregion
    }
}